# -*- coding: utf-8 -*-#
#-------------------------------------------------------------------------------
# 建立者:        Young  
# Name:         demo10.05
# Description:
# Author:       $赵怡蕾
# Date:         2019/3/6
#-------------------------------------------------------------------------------

# 定义一个从list继承的类
class CounterList(list):
    # list的构造方法必须指定一个可变参数，用于初始化列表
    def __init__(self, *args):
        super().__init__(*args)
        # 初始化计数器
        self.counter = 0

    # 当从列表中获取值时，计数器加1
    def __getitem__(self, index):
        self.counter += 1
        # 调用超类的__getitem__方法获取指定的值，当前方法只负责计数器加1
        return super(CounterList, self).__getitem__(index)

# 创建一个CounterList对象，并初始化列表
c = CounterList(range(10))
# 运行结果：[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(c)
# 反转列表c
c.reverse()
# 运行结果：[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(c)
# 删除c中的一组列表
del c[2:7]
# 运行结果：[9, 8, 2, 1, 0]
print(c)
# 运行结果：0
print(c.counter)
# 将列表c中的两个值相加，这时计数器加2，运行结果：10
print(c[1] + c[2])
# 运行结果：2
print(c.counter)

# 定义一个从dict继承的类
class CounterDict(dict):
    # dict的构造方法必须指定一个可变参数，用于初始化字典
    def __init__(self,*args):
        super().__init__(*args)
        # 初始化计数器
        self.counter = 0
    # 当从列表中获取值时，计数器加1
    def __getitem__(self, key):
        self.counter += 1
        # 调用超类的__getitem__方法获取指定的值，当前方法只负责计数器加1
        return super(CounterDict,self).__getitem__(key)
# 创建CounterDict对象，并初始化字典
d = CounterDict({'name':'Bill'})
# 运行结果：Bill
print(d['name'])
# get方法并不会调用__getitem__方法，所以计数器并不会加1，运行结果：None
print(d.get('age'))
# 为字典添加新的key-value对
d['age'] = 30
# 运行结果：30
print(d['age'])
# 运行结果：2
print(d.counter)

# 定义一个从str继承的类
class MultiString(str):
    # 该方法会在__init__方法之前调动，用于验证字符串构造方法的参数
    # 该方法的参数要与__init__方法的参数保持一致
    def __new__(cls, *args, sep = ''):
        s = ''
        # 将可变参数中所有的值连接成一个大字符串，中间用end指定的分隔符分隔
        for arg in args:
            s += arg + sep
        # 最后需要去掉字符串结尾的分隔符，所以先算出最后的分隔符的开始索引
        index = -len(sep)
        if index == 0:
            index = len(s)
            # 返回当前的MultiString对象
            return str.__new__(cls,s[:index])
    def __init__(self, *args, sep = ' '):
        pass
# 连接'a'、'b'、'c'三个字符串，中间用空格分隔
cs1 = MultiString('a','b','c')
# 连接'a'、'b'、'c'三个字符串，中间用逗号分隔
cs2 = MultiString('a','b','c',sep=',')
# 连接'a'、'b'、'c'三个字符串，中间没有分隔符
cs3 = MultiString('a','b','c',sep='')
# 运行结果：[a b c]
print('[' + cs1 +']')
# 运行结果：[a,b,c]
print('[' + cs2 +']')
# 运行结果：[abc]
print('[' + cs3 +']')